/**
 * 流式聊天 API 接口
 * 基于 SSE (Server-Sent Events) 实现
 */

import { streamChatRequest } from '@/utils/sse';

// 流式聊天请求参数
export interface StreamChatParams {
  message: string;
  chatId: string | number;
  model?: string;
  temperature?: number;
  maxTokens?: number;
}

// 流式响应数据结构
export interface StreamResponse {
  type: 'chunk' | 'done' | 'error';
  content?: string;
  message?: string;
  metadata?: {
    tokens?: number;
    model?: string;
    finishReason?: string;
  };
}

/**
 * 发送流式聊天请求
 * @param params 聊天参数
 * @param callbacks 回调函数
 */
export async function sendStreamChat(
  params: StreamChatParams,
  callbacks: {
    onChunk: (content: string) => void;
    onComplete?: (metadata?: any) => void;
    onError?: (error: Error) => void;
  }
) {
  try {
    const streamClient = await streamChatRequest(
      params.message,
      params.chatId,
      callbacks.onChunk,
      callbacks.onComplete,
      callbacks.onError
    );

    return streamClient;
  } catch (error) {
    console.error('发送流式聊天失败:', error);
    callbacks.onError?.(error as Error);
    throw error;
  }
}

/**
 * 模拟流式响应（用于开发测试）
 * 实际项目中应该连接真实的流式 API
 */
export function mockStreamResponse(
  message: string,
  onChunk: (chunk: string) => void,
  onComplete?: () => void,
  onError?: (error: Error) => void
): Promise<void> {
  return new Promise((resolve, reject) => {
    const responses = [
      '我理解你的问题',
      '，让我来',
      '为你详细',
      '解答一下',
      '这个问题',
      '的相关内容',
      '。\n\n首先',
      '，我们需要',
      '明确几个',
      '关键点',
      '：\n\n1. ',
      '这是第一个',
      '重要的方面',
      '\n2. 第二个',
      '需要考虑的',
      '因素\n3. ',
      '最后一个',
      '关键要素',
      '\n\n希望',
      '这个回答',
      '对你有帮助',
      '！',
    ];

    let index = 0;
    const interval = setInterval(() => {
      if (index < responses.length) {
        onChunk(responses[index]);
        index++;
      } else {
        clearInterval(interval);
        onComplete?.();
        resolve();
      }
    }, 100); // 每100ms发送一个chunk

    // 模拟可能的错误
    if (Math.random() < 0.05) {
      // 5% 概率出错
      setTimeout(() => {
        clearInterval(interval);
        const error = new Error('模拟网络错误');
        onError?.(error);
        reject(error);
      }, Math.random() * 2000 + 1000);
    }
  });
}

export default {
  sendStreamChat,
  mockStreamResponse,
};
